﻿#include "stdafx.h"
#include "RecordTreeModel.h"
#include "RecordFilterModel.h"

//==================================================================================================
QRecordFilterModel::QRecordFilterModel( QObject * parent ) : QSortFilterProxyModel( parent )
{
	ShowGroup = false;
	ShowAll = false;
}

QRecordFilterModel::~QRecordFilterModel( )
{
	ShowGroup = false;
	ShowAll = false;
}

//==================================================================================================
QRecordTreeModel * QRecordFilterModel::dataModel( void ) const
{
	return qobject_cast< QRecordTreeModel * >( sourceModel( ) );
}

void QRecordFilterModel::dataModel( QRecordTreeModel * model )
{
	setSourceModel( model );
}

//==================================================================================================
bool QRecordFilterModel::showGroup( void ) const { return ShowGroup; }

void QRecordFilterModel::showGroup( bool value )
{
	CHK_EXP_END( ShowGroup == value );
	
	//	更新模型内容
	ShowGroup = value;
	switchModel( );
}


//==================================================================================================
bool QRecordFilterModel::showAll( void ) const { return ShowAll; }

void QRecordFilterModel::showAll( bool value )
{
	CHK_EXP_END( ShowAll == value );
	ShowAll = value;
	switchModel( );
}

void QRecordFilterModel::switchModel( void )
{
	//更新模型内容, 根据ShowGroup进行判断	
	if( ShowGroup )
	{
		//分组、显示分类树
		dataModel( )->setFieldCol( ID, PID);
		dataModel( )->setRoot( groupNode );
	}
	else
	{
		//不分组、显示列表
		dataModel()->setFieldCol(ID, GroupField);
		dataModel()->setRoot(noGroupNode);
	}
}

//==================================================================================================
void QRecordFilterModel::setFields( short id, short Pid, short Alias, short GroupFiled, short DataField )
{
	this->ID = id;
	this->PID = Pid;
	this->Alias = Alias;
	this->GroupField = GroupFiled;
	this->DataField = DataField;
}

void QRecordFilterModel::setRootNode(int groupNode, int noGroupNode)
{
	this->groupNode   = groupNode;
	this->noGroupNode = noGroupNode;
	switchModel( );
}

QModelIndex QRecordFilterModel::getModelIndex( const QVariant & cid )
{
	QModelIndex index = dataModel( )->getModelByID( cid );
	CHK_EXP_RET( index == QModelIndex( ) , index );
	return mapFromSource( index );
}

QModelIndex QRecordFilterModel::getGroupModel(int row)
{
	QModelIndex treeModelindex = dataModel( )->getModelByIndex( row );
	return mapFromSource( treeModelindex );
}

QModelIndex QRecordFilterModel::getGroupModel( )
{
	int row = dataModel( )->records( ).getNotFetchRow( DataField , 0 );
	CHK_EXP_RET( row == -1 , QModelIndex( ) );
	return getGroupModel( row );
}

//==================================================================================================
bool QRecordFilterModel::filterAcceptsRow( int row , const QModelIndex & parent ) const
{
	/*

	  GroupField 判断该行是否属于分组字段， 不属于分组为：0， 属于分组为：1；
	  DataField  GroupField=0 的行数据代表该设备与类型关联的个数， 0 为未关联类型
				 GroupField=1 的行代表该分组下的子节点个数， 0为无子节点。

	*/

	//全部显示不分组时不需要过滤， 分组时需要过滤

	if(ShowAll && !ShowGroup)
		return true;
	
	if( ShowGroup )
	{
		QModelIndex source_index = dataModel( )->index( row, 0, parent );
		int rowCount = dataModel( )->rowCount( source_index );

		for( int k=0; k<rowCount; k++ )
		{
			if(filterAcceptsRow( k, source_index ) )
			{
				return true;
			}
		}

		//分组时过滤掉没有关联类型的设备的节点
		//设备节点保留父节点
		//显示未分组的节点

		int currentRow = source_index.internalId( );
		int iGroup = dataModel( )->records( ).data( currentRow , GroupField ).toInt();
		int iHasData = dataModel()->records().data(currentRow, DataField).toInt();

		if( iHasData > 0 || ShowAll )
		{
			if( iGroup == 0 )
				return true;

			if( rowCount > 0 )						
				if( rowCount > iHasData )
					return true;			
		}
	}
	else
	{
		//不分组时简化处理
		QModelIndex source_index = dataModel( )->index( row, 0, parent );
		int currentRow = source_index.internalId( );
		int iHasData = dataModel( )->records( ).data( currentRow , DataField ).toInt();
		if( iHasData > 0 )
			return true;
	}

	return false;
}

Qt::ItemFlags QRecordFilterModel::flags(const QModelIndex & index) const
{
	CHK_EXP_RET( rowCount( index ) > 0 , QAbstractItemModel::flags( index ) & ~Qt::ItemIsEnabled );
	return QAbstractItemModel::flags( index ) | Qt::ItemIsEnabled ;
}
